﻿using System;
using System.Collections.Generic;
using System.Text;
using ITAP.Core.Modelling.Primitives;

namespace ITAP.ShprossesBuilder.Modelling.Components
{
    /// <summary>
    /// Определяет, к какой из границ примитива IWidePrimitive может осуществляться соединение. Необходимо для некоторых Constraints, 
    /// которые подсчитывают положение начала или конца, приконнекченного к некоторому компоненту. Например, 
    /// при коннекте к дистанционной рамке соединителя в рамку он должен коннектиться к внутренней стороне контура, 
    /// т.е. к ToUpBorder (рамка расположена UpBorder вовнутрь). А при коннекте соединителя "сбоку" профиля 
    /// (например, при соединении "один профиль в другой") нужно коннектиться к ближайшей границе.
    /// </summary>
    public enum StickConnectionType
    {
        Auto,
        ToDownBorder,
        ToUpBorder,
        ToCenter,
        /// <summary>
        /// С ближайшей границей.
        /// </summary>
        ToNearest, 
        ToNearestBorder, 
        None
    }

    [Serializable]
    public struct ConnectionInfoItem
    {
        private StickConnectionType connectionType;

        public StickConnectionType ConnectionType
        {
            get { return connectionType; }
        }
        private Type componentType;

        public Type ComponentType
        {
            get { return componentType; }
        }

        public ConnectionInfoItem(Type componentType, StickConnectionType connectionType)
        {
            this.componentType = componentType;
            this.connectionType = connectionType;
        }
    }

    [Serializable]
    public class ConnectionInfo : List<ConnectionInfoItem>
    {
        public void Add(Type componentType, StickConnectionType connectionType)
        {
            base.Add(new ConnectionInfoItem(componentType, connectionType));
        }

        public void Add(Type componentType)
        {
            this.Add(componentType, StickConnectionType.Auto);
        }

        public bool Contains(Type type)
        {
            foreach (ConnectionInfoItem item in this)
                if (item.ComponentType == type)
                    return true;
            return false;
        }

        public StickConnectionType GetStickType(Type type)
        {
            foreach (ConnectionInfoItem item in this)
                if (item.ComponentType == type)
                    return item.ConnectionType;

            return StickConnectionType.Auto;
        }
    }
}
